/** bolaclient.c - Cliente do jogo **/
#include <stdio.h>
#include <stdlib.h>

#include "bola.h"
#include "bolaclient.h"
#include "grafico.h"

static CLIENT *clnt;

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s hostname\n", argv[0]);
        exit(0);
    }

        /** Conecta o cliente **/
    clnt = clnt_create(argv[1], BOLA_PROG, BOLA_VERSION, "udp");

    if (clnt == (CLIENT *) NULL)
    {
        clnt_pcreateerror(argv[1]);
        exit(1);
    }

    game_init();
        /** Faz o login **/
    /* player *p = malloc(sizeof(player));

       printf("Digite seu nome: "); char name[80]; scanf("%s", name); p->name
       = name; */

        /** Loop principal **/
    /* int quit = 0; while (!quit) {

       if (addplayer(p) == -1) { printf("Erro ao criar jogador.\n"); return 1;
       } */

        /** Salas **/
    /* int sala, a; char nome_sala[80];

       printf("\n1 - Criar sala\n2 - Selecionar sala\n3 - Sair\nDigite sua
       opcao: "); scanf("%d", &a);

       if (a == 2) { */
    /* Selecionar sala */
    /* printf("Digite o numero da sala: "); scanf("%d", &sala); if
       (joinroom(sala, p) == -1) { printf("Sala ocupada ou inexistente!\n");
       return 1; } else { */
    /* Inicia o jogo */
    // game_init(sala, 0);
    // }
    // }
    // else if (a == 3) {
                /** Sair **/
    // return 0;
    // }
    // else {
    /* Criar sala */
    /* printf("Digite o nome da sala: "); scanf("%s", nome_sala); if ((sala =
       createroom(nome_sala, p)) == -1) { printf("Não ha espaco no servidor
       para criar essa sala. Tente mais tarde.\n"); return 1; } else { */
    /* Inicia o jogo */
    /* game_init(sala, 1); } }

       } */
    return 0;
}

/**
 * Adiciona um jogador. Retorna -1 em caso de erro.
 */
int addplayer(player * p)
{
    int *result = NULL;

    p->score = 0;

    result = addplayer_1(p, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Entra numa sala. Retorna o número da sala ou -1 se ocorrer um erro.
 */
int joinroom(int num, player * p)
{
    room r;

    int *result;

    r.room_id = num;
    r.p = (*p);

    result = joinroom_1(&r, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Cria uma sala. Retorna o número da sala ou -1 se não tiver espaço no servidor.
 */
int createroom(char *room_name, player * p)
{
    room r;

    int *result;

    r.name = room_name;
    r.p = (*p);

    result = createroom_1(&r, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Faz uma tacada. Retorna o número da tacada ou -1 se a sala não existe.
 */
int makeshot(float force, float angle, int room_id)
{
    shot s;

    int *result;

    s.force = force;
    s.angle = angle;
    s.room_id = room_id;

    result = makeshot_1(&s, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Espera uma tacada. Retorna 1 se a tacada esperada foi feita e 0 caso contrário.
 * shot_num é o número da tacada atual.
 */
int waitshot(int shot_num, int room_id)
{
    shot s;

    int *result;

    s.room_id = room_id;
    s.shot_num = shot_num;

    result = waitshot_1(&s, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Retorna a força da última tacada.
 */
float waitshotforce(int room_id)
{
    float *result;

    result = waitshotforce_1(&room_id, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Retorna o ângulo da última tacada.
 */
float waitshotangle(int room_id)
{
    float *result;

    result = waitshotangle_1(&room_id, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Remove jogador. Retorna -1 se o jogador não existir.
 */
int rmplayer(player * p)
{
    int *result = NULL;

    result = rmplayer_1(p, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

/**
 * Remove sala. Retorna -1 se a sala não existir.
 */
int rmroom(int num)
{
    int *result;

    result = rmroom_1(&num, clnt);
    if (result == NULL)
    {
        fprintf(stderr, "Trouble calling RPC\n");
        return -1;
    }

    return (*result);
}

void inc_score(player * p)
{
    p->score++;
}
